﻿using Digitalmes.DataAccess;
using Digitalmes.Model;
using Digitalmes.Model.FactoryManagement;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;
using WalkingTec.Mvvm.Core;

namespace Digitalmes.Services
{
    public class EncodeService : BaseService,ITransient
    {
       
        public EncodeService(IServiceProvider serviceProvider) : base(serviceProvider)
        {
           
        }

        /// <summary>
        /// 根据编码方案生成编码
        /// </summary>
        /// <param name="schemeId">编码方案ID</param>
        /// <returns>生成的编码</returns>
        public async Task<string> GenerateCodeAsync(long schemeId)
        {
            // 使用事务确保数据一致性
            using (var trans = await Wtm.DC.Database.BeginTransactionAsync())
            {
                try
                {
                    // 锁定方案记录防止并发问题
                    var scheme = await Wtm.DC.Set<EncodeScheme>()
                        .Include(x => x.EncodeItem_Scheme)
                        .Where(x => x.ID == schemeId && x.IsValid)
                        .FirstOrDefaultAsync();

                    if (scheme == null)
                    {
                        throw new Exception("编码方案不存在或已失效");
                    }

                    if (scheme.EncodeItem_Scheme == null || !scheme.EncodeItem_Scheme.Any())
                    {
                        throw new Exception("编码方案未配置编码项");
                    }

                    // 按顺序排序编码项
                    var sortedItems = scheme.EncodeItem_Scheme
                        .Where(x => x.IsValid)
                        .OrderBy(x => x.Pos)
                        .ToList();

                    var codeParts = new System.Collections.Generic.List<string>();

                    foreach (var item in sortedItems)
                    {
                        switch (item.ValueMode)
                        {
                            case ValueTypeEnum.FixedValue:
                                // 固定值类型
                                codeParts.Add(item.Value);
                                break;

                            case ValueTypeEnum.SerialNumber:
                                // 流水号类型
                                if (int.TryParse(item.Value,out var val)  && scheme.SerialNumber.HasValue)
                                {
                                    // 格式化流水号（支持补位，例如Value为"0000"表示4位补零）
                                    var serialStr = scheme.SerialNumber.Value.ToString().PadLeft(val, '0');
                                    codeParts.Add(serialStr);
                                    // 流水号自增
                                    scheme.SerialNumber++;
                                }
                               
                                break;

                            case ValueTypeEnum.Custom:
                                // 自定义类型（处理年月日等日期格式） 
                                // 先校验item.Value是否为有效的日期格式
                                if (DateTime.TryParseExact(DateTime.Now.ToString(item.Value),
                                    item.Value,
                                    System.Globalization.CultureInfo.InvariantCulture,
                                    System.Globalization.DateTimeStyles.None,
                                    out _))
                                {
                                    // 有效的日期格式，使用当前时间格式化
                                    codeParts.Add(DateTime.Now.ToString(item.Value));
                                }
                                else
                                {
                                    // 不识别的格式直接使用值
                                    codeParts.Add(item.Value);
                                }
                                
                                break;

                            default:
                                codeParts.Add(item.Value);
                                break;
                        }
                    }

                    // 保存流水号变更
                    Wtm.DC.Set<EncodeScheme>().Update(scheme);
                    await Wtm.DC.SaveChangesAsync();
                    await trans.CommitAsync();

                    // 拼接最终编码
                    return string.Join("", codeParts);
                }
                catch (Exception ex)
                {
                    await trans.RollbackAsync();
                    throw new Exception($"编码生成失败: {ex.Message}");
                }
            }
        }

        /// <summary>
        /// 根据编码方案代码生成编码
        /// </summary>
        /// <param name="schemeCode">编码方案代码</param>
        /// <returns>生成的编码</returns>
        public async Task<string> GenerateCodeBySchemeCodeAsync(string schemeCode)
        {
            var scheme = await Wtm.DC.Set<EncodeScheme>()
                .Where(x => x.FormCode == schemeCode && x.IsValid && x.Active == true)
                .FirstOrDefaultAsync();

            if (scheme == null)
            {
                return string.Empty;    
            }

            return await GenerateCodeAsync(scheme.ID);
        }
    }
}
